package test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author sunzhuokun
 * @date 15:45 2024/5/10
 * @description 字符串中所有整数最小和
 * 输入字符串s，输出s中包含所有整数的最小和。
 * <p>
 * 说明：
 * 字符串s，只包含 a-zA-Z±。
 * <p>
 * 合法的整数包括：
 * 1 )正整数 一个或者多个0-9组成,如 02 3 002 102；
 * 2)负整数 负号-开头，数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023；
 * <p>
 * 输入描述：
 * 包含数字的字符串
 * <p>
 * 输出描述
 * 所有整数的最小和
 * <p>
 * 例如：
 * <p>
 * 输入：bb1234aa
 * 输出：10
 * <p>
 * 输入：bb12-34aa
 * 输出：-31
 * <p>
 * 输入：bb12-34aa34f-24
 * 输出：-48
 */
public class MinSumInString_字符串中所有整数最小和 {

    public static void main(String[] args) {
        String str1 = "bb1234aa";
        String strf = "bb12-34aa";
        String strg = "bb12-34aa34f-24";
        System.out.println(sum2(strg));
//        System.out.println(Long.parseLong("-48".toString()));
    }

    private static String sum(String strg) {
        if (strg == null || strg.trim().length() == 0) {
            return null;
        }

        List<Long> digArr = new ArrayList<>();
        StringBuilder num = new StringBuilder();
        boolean preIsNum = false;
        for (int i = 0; i < strg.length(); i++) {
            if (strg.charAt(i) == '-') {
                if (preIsNum) {
                    digArr.add("".equals(num.toString()) ? 0l : Long.parseLong(num.toString()));
                    num = new StringBuilder("-");
                } else {
                    num = new StringBuilder("");
                    num.append(strg.charAt(i));
                    preIsNum = true;
                }
                continue;
            }
            if (Character.isDigit(strg.charAt(i))) {
                num.append(strg.charAt(i));
                preIsNum = true;
            } else {
                digArr.add("".equals(num.toString()) ? 0l : Long.parseLong(num.toString()));
                num = new StringBuilder("");
                preIsNum = false;
            }
        }

        // 最后判断num是否数字
        if (preIsNum) {
            digArr.add(Long.parseLong(num.toString()));
        }

        // 对digArr集合中的元素求和，用java8的流式编程
        return String.valueOf(digArr.stream().mapToLong(Long::longValue).sum());
    }

    private static String sum2(String line) {
        char[] chars = line.toCharArray();
        int n = chars.length;
        int sum = 0;

        for (int i = 0; i < n; i++) {
            // 整数单个加和
            if (chars[i] > '0' && chars[i] <= '9') {
                // 正数，只取一位，不超过10的个位数
                sum += chars[i] - '0';
            } else if (chars[i] == '-') {
                // 负数，取连着的一串数
                int j = i + 1;
                while (j < n && chars[j] >= '0' && chars[j] <= '9') {
                    j++;
                }
                sum += Integer.parseInt(line.substring(i, j));
                // 此时 j 所指可能是符号，所以不能跳过
                i = j - 1;
            }
        }
        return String.valueOf(sum);
    }
}
